package de.fhffm.gui;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

import de.fhffm.tables.Mitarbeiter;

public class NeuerMitarbeiterFenster implements ActionListener{
	
	private JFrame neuerMitarbeiterFrame = new JFrame();
	
	private JPanel eingabePanel = new JPanel( );
	private JPanel buttonPanel = new JPanel( );
	

	private JLabel labelVorname = new JLabel( "Vorname" );
	private JTextField txtVorname = new JTextField( 15 );
	
	private JLabel labelNachname = new JLabel( "Nachname" );
	private JTextField txtNachname = new JTextField( );
	
	private JLabel labelBenutzername = new JLabel( "Bentzername" );
	private JTextField txtBenutzername = new JTextField( );
	
	private JLabel labelPasswort = new JLabel( "Passwort" );
	private JPasswordField txtPasswort = new JPasswordField( );
	
	private JButton btnOk = new JButton( "OK" );
	private JButton btnAbbrechen = new JButton( "abbrechen" );
	private JButton btnReset = new JButton( "Reset" );
	
	private String vorname = null;
	private String nachname = null;
	private String benutzername = null;
	private String passwort = null;
	
	
	public NeuerMitarbeiterFenster()
	{
		neuerMitarbeiterFrame.setTitle("Neue Mitarbeiter anlegen");
		
		neuerMitarbeiterFrame.setLocation(80,60);
		neuerMitarbeiterFrame.setLocationRelativeTo(null);
		neuerMitarbeiterFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		
		bestandteileAnordnen();
		neuerMitarbeiterFrame.pack();
		ereignissensorenAnmeldung();
		neuerMitarbeiterFrame.setVisible(true);
	}
	
	public void bestandteileAnordnen(){
		
		GroupLayout dafLayout = new GroupLayout(neuerMitarbeiterFrame.getContentPane());
		neuerMitarbeiterFrame.getContentPane().setLayout(dafLayout);
		
		dafLayout.setAutoCreateGaps(true);
		dafLayout.setAutoCreateContainerGaps(true);
		
	
		dafLayout.setVerticalGroup(dafLayout.createSequentialGroup().
				addComponent(eingabePanel).
				addComponent(buttonPanel)
		);
		
		dafLayout.setHorizontalGroup(dafLayout.createParallelGroup().
				addComponent(eingabePanel).
				addComponent(buttonPanel)
		);		
		
		eingabePanelAnordnen();
		buttonPanelAnordnen();
	}
	
	
	public void eingabePanelAnordnen(){
		
		GroupLayout eingabePanelLayout = new GroupLayout(eingabePanel);
		eingabePanel.setLayout(eingabePanelLayout);
		
		eingabePanelLayout.setAutoCreateGaps(true);
		eingabePanelLayout.setAutoCreateContainerGaps(true);
		
		eingabePanelLayout.setVerticalGroup(eingabePanelLayout.createSequentialGroup( ).
					addGroup(eingabePanelLayout.createParallelGroup( GroupLayout.Alignment.BASELINE ).
						addComponent( labelNachname ).
						addComponent( txtNachname )
					).
					addGroup(eingabePanelLayout.createParallelGroup( GroupLayout.Alignment.BASELINE ).
					  	addComponent( labelVorname ).
						addComponent( txtVorname )
					).
					addGroup(eingabePanelLayout.createParallelGroup( GroupLayout.Alignment.BASELINE ).
						  	addComponent( labelBenutzername ).
							addComponent( txtBenutzername )
						).
			  		addGroup(eingabePanelLayout.createParallelGroup( GroupLayout.Alignment.BASELINE ).
			  			addComponent( labelPasswort ).
			  			addComponent( txtPasswort )));
						
		eingabePanelLayout.setHorizontalGroup(eingabePanelLayout.createParallelGroup( ).addGroup(eingabePanelLayout.createSequentialGroup( ).
					addGroup( eingabePanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false ).
						addComponent( labelNachname, GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( labelVorname,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( labelBenutzername,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( labelPasswort, GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE )
						).
					addGroup( eingabePanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false ).
						addComponent( txtNachname, GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( txtVorname,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( txtBenutzername,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( txtPasswort, GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE )
						)));
			
	}
	
	public void buttonPanelAnordnen(){
		
		GroupLayout buttonPanelLayout = new GroupLayout(buttonPanel);
		buttonPanel.setLayout(buttonPanelLayout);
		
		buttonPanelLayout.setAutoCreateGaps(true);
		buttonPanelLayout.setAutoCreateContainerGaps(true);
		
		buttonPanelLayout.setVerticalGroup(buttonPanelLayout.createSequentialGroup().
				addGroup(buttonPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE).
						addComponent(btnOk).
						addComponent(btnReset).
						addComponent(btnAbbrechen)
				)
		);
		
		buttonPanelLayout.setHorizontalGroup(buttonPanelLayout.createSequentialGroup().
				addGroup(buttonPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false).
						addComponent(btnOk, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
				).
				addGroup(buttonPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false).
						addComponent(btnReset, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
				).
				addGroup(buttonPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false).
						addComponent(btnAbbrechen, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
				)
		);
	}
	
	public void ereignissensorenAnmeldung(){
		btnOk.addActionListener(this);
		btnReset.addActionListener(this);
		btnAbbrechen.addActionListener(this);
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		Object obj = e.getSource();

		if (obj == btnAbbrechen) {	
			neuerMitarbeiterFrame.dispose();
		}
		
		if(obj == btnReset){
			loescheTextFelder();
		}
		
		if(obj == btnOk){
			
			if(ueberpruefeEingabe()){
				
				if(mitarbeiterNichtVorhanden()){ 
					fuegeMitarbeiterEin();
					 einfügenEnde();
				}else{
					System.out.println("Duenger schon vorhanden!");
				}
			
			} else{
				
				System.out.println("Eingabe Fehler");
			}
			
		}
		
	}
	
	private void fuegeMitarbeiterEin() {
		System.out.println("Mitarbeiter wird angelegt");
		
		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("test");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		
		Mitarbeiter mitarbeiter = new Mitarbeiter();
		
		mitarbeiter.setVorname(vorname);
		mitarbeiter.setNachname(nachname);
		mitarbeiter.setBenutzername(benutzername);
		mitarbeiter.setPasswort(passwort);
		
		em.persist(mitarbeiter);
		em.getTransaction().commit();
		em.close();
	}
	
	public void einfügenEnde(){
		Object[] options = {"Fertig!","wetere Mitarbeiter registrieren!"};
		int selected = JOptionPane.showOptionDialog(null,"Neuer Mitarbeiter erfolgreich registriert!", "Registrierung Erfolgreich", JOptionPane.YES_NO_OPTION,
					   JOptionPane.QUESTION_MESSAGE, null , options ,options[1]);
		
		switch(selected){
		case 0:
			neuerMitarbeiterFrame.dispose();
			break;
		case 1:
			loescheTextFelder();
			break;
		
		
		}
	}
	
	private void loescheTextFelder() {
		
		txtNachname.setText(null);
		txtVorname.setText(null);
		txtBenutzername.setText(null);
		txtPasswort.setText(null);
	}
	
	private boolean ueberpruefeEingabe() {
		boolean pruefe = false;
		try {
			pruefe = hohleEingabe();
		} catch (InputException e) {
			System.out.println("Eingabe Fehlt");
		} catch (NumberFormatException n){
			System.out.println("Bitte Zahlen eingeben!");
			JOptionPane.showMessageDialog(null,"Bitte für Phosphat,Magnesium, Kalium und Stickstoff nur Zahlen eingeben.","Fehler",JOptionPane.ERROR_MESSAGE);
		}
		return pruefe;
		
	}
	
	private boolean hohleEingabe() throws InputException,NumberFormatException {
		
		vorname = txtVorname.getText();
		nachname = txtNachname.getText();
		benutzername = txtBenutzername.getText();
		passwort = String.valueOf(txtPasswort.getPassword());
		
		if(isEingabeLeer()){
			
			throw new InputException("Eine oder mehrere Eingaben fehlen.");
		
		}else{
			
			return true;

		}
	}
	
	private boolean isEingabeLeer() {
		
		if(vorname.length() == 0 || nachname.length() == 0 || benutzername.length() == 0 || passwort.length() == 0){
		
			return true;
		
		}else{
		
			return false;
		}
	}
	
	
	private boolean mitarbeiterNichtVorhanden() {
		boolean isVorhanden = false;
		
		try {
			isVorhanden = ueberpruefeMitarbeiter();
			
		} catch (InputException e) {
			System.out.println("Mitarbeiter schon vorhanden Exception!");
		}

		return isVorhanden;

	}

	private boolean ueberpruefeMitarbeiter() throws InputException {
		
		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("test");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		
		Query q = em.createQuery("SELECT m FROM Mitarbeiter m WHERE  m.benutzername = :name");
   	 			  q.setParameter("name", benutzername);
   	 			  
   	 	if(q.getResultList().size() == 0){
   	   	 	em.close();   
   	   	    System.out.println("Mitarbeiter noch nicht vorhanden.");
   	   	    return true;

   	 		   
   	 	 }else{
   	   	    em.close();
   	   	    throw new InputException("Mitarbeiter schon vorhanden.");
   	 	   
   	 	 }
	}
	
}




